package com.jdbctest.numberone;

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class ConnectionTest {

    //方式一:
    @Test
    public void testConnection1() throws SQLException {
        //获取Driver实现类的对象
        Driver driver = new com.mysql.jdbc.Driver();

        // url:http://localhost:8080/gmall/keyboard.jpg
        // jdbc:mysql:协议
        // localhost:ip地址
        // 3306：默认mysql的端口号
        // test:test数据库

        String url = "jdbc:mysql://192.168.85.130:33306/cloud";
        //将用户名和密码封装再Properties中
        Properties info = new Properties();
        info.setProperty("user", "root");
        info.setProperty("password", "123456");

        Connection connection = driver.connect(url, info);

        System.out.println(connection);
    }


    //方式二:对方式一的迭代:在如下的程序中不出现第三方的api,使得程序具有更好的可移植性
    @Test
    public void testConnection2() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
        //1.获取Driver实现类对象:使用反射  com.mysql.jdbc.Driver
        //连接mysql8使用com.mysql.cj.jdbc.Driver
        Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
        Driver driver = (Driver) clazz.newInstance();

        //2.提供要连接的数据库
        String url = "jdbc:mysql://192.168.85.130:33306/cloud";

        //3.提供连接需要的用户名和密码
        Properties info = new Properties();
        info.setProperty("user", "root");
        info.setProperty("password", "123456");

        //4.获取连接
        Connection connect = driver.connect(url, info);

        System.out.println(connect);

    }

    //方式三: 使用DriverManager替换Driver
    @Test
    public void testConnection3() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {

        //1.获取Driver实现类的对象
        Class<?> aClass = Class.forName("com.mysql.cj.jdbc.Driver");
        Driver driver = (Driver) aClass.newInstance();

        //2.提供另外三个连接的基本信息
        String url = "jdbc:mysql://192.168.85.130:33306/cloud";
        String user = "root";
        String password = "123456";


        //注册驱动
        DriverManager.registerDriver(driver);

        //获取连接
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);

    }


    //方式四:可以只是加载驱动，不用显示的注册驱动过了
    @Test
    public void testConnection4() throws ClassNotFoundException, SQLException {
        //1.提供三个连接的基本信息
        String url = "jdbc:mysql://192.168.85.130/cloud";
        String user = "root";
        String password = "123456";


        //2.加载Driver
        Class.forName("com.mysql.cj.jdbc.Driver");

        //相较于方式三，可以省略如下的操作：
//		Driver driver = (Driver) clazz.newInstance();
//		// 注册驱动
//		DriverManager.registerDriver(driver);
        //为什么可以省略上述操作呢？
		/*
		 * 在mysql的Driver实现类中，声明了如下的操作：
		 * static {
				try {
					java.sql.DriverManager.registerDriver(new Driver());
				} catch (SQLException E) {
					throw new RuntimeException("Can't register driver!");
				}
			}
		 */

        //3.获取连接
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);

    }

    //方式五(final版):将数据库连接需要的4个基本信息生命在配置文件中，通过读取配置文件的方式，获取连接
    /**
     * 此种方式的好处?
     * 1.实现了数据与代码的分离，实现了解耦
     * 2.如果需要修改配置文件信息，可以避免程序重新打包
     */
    @Test
    public void getConnection5() throws IOException, ClassNotFoundException, SQLException {

        //1.读取配置文件中的4个基本信息
        InputStream resourceAsStream = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");

        Properties properties = new Properties();
        properties.load(resourceAsStream);

        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driverClass = properties.getProperty("driverClass");

        //2.加载驱动
        Class.forName(driverClass);

        //3.获取链接
        Connection connection = DriverManager.getConnection(url, user, password);

        System.out.println(connection);

    }


}
